/* WARNING!!  This message format is in pre-alpha development.  There is a high
 * probability any of these formats will change, which will cause prior
 * versions to no longer work.  You are more than welcome to setup to help us
 * develop and/or test, but it is NOT recommend you use the server or message
 * formats for production purposes until we at least reach beta development.
 * Thank you.
 */


syntax = "proto3";


/*
 * ContributionType: This is an enumeration that defines what each person
 * contributed to the track.  This can be used to keep track of who helped on
 * each mix.  It is automatically maintained by the server based on the
 * messages that are uploaded & (if necessary) approved by the owner.  Note: we
 * can consider adding additional types for certain instruments, e.g. guitar,
 * bass, drums, vocals, etc.  Given how many different types of instruments
 * there are out there, and the fact that users can contribute with multiple
 * instruments (and adding more as we find some we missed and/or new ones are
 * invented, I'm not sure if we want to allow this level of specificity.
 * We need to think on this more.
 */

enum ContributionType {
	Owner = 0;				// Person who uploaded the Project
	BandMember = 1;			// Person who is able to upload without approval
	ContentContributer = 2;	// Person who submitted changes to the song but are
							//   not directly affiliated with the owner (an
							//   outside contributer) and required approval
	MixingEngineer = 3;		// Person who did not add to the song content-wise
							//   but mixed the content.
	MasteringEngineer = 4;  // Person who did not add to the song content-wise
							//   but mastered the content after it was mixed.
}


/*
 * DataType:  Identifies whether or not the track/clip contains audio data or
 * MIDI data.
 */
enum DataType {
	Audio = 0;
	Midi = 1;
}


/*
 * ChangeType: Used to identify the type of change being made in an automation
 * event.  Is it an immediate jump from the old value to a new value,
 * consistent ramp, curved ramp, etc.?
 */
enum ChangeType {
	Immediate = 0;
	StraightRamped = 1;
	CurvedRamped = 2;
}


/*
 * PluginType:  Identifies the format of the plugin.  Note: Starting with the
 * most common Linux Plugins, since those are the ones I know best, but we will
 * want to expand the list to include plugin formats used on other OS's as
 * well.
*/

enum PluginType {
	LADSPA = 0;
	DSSI = 1;
	LV2 = 2;
	VST2 = 3;
	VST3 = 4;
	AU = 5;
}


/*
 * EffectType: A list of effects types.  This can be used in logic to use an
 * alternate plugin if the original plugin is not available on another system.
 */

enum EffectType {
	AmpModel = 0;
	Autotune = 1;
	BitCrusher = 2;
	Chorus = 3;
	Compressor = 4;
	Delay = 5;				// Include Echo, or should echo be separate?
	Distortion = 6;
	Envelope = 7;
	Equalizer = 8;
	Expander = 9;			// a.k.a. Stereo Widener
	Flanger = 10;
	Gate = 11;				// a.k.a. Noise Gate
	ImpulseResponse = 12;
	Limiter = 13;
	Meter = 14;
	Overdrive = 15;
	Phaser = 16;
	Repeater = 17;
	Reverb = 18;
	Sampler = 19;
	Slicer = 20;
	Synthesizer = 21;		// Includes Oscillators
	Tremolo = 22;
	Vocoder = 23;
	Wah = 24;
}


/*
 * ParameterType: Identifies whether the value to be changed is on the Track or
 * on a specific plugin. NOTE: PT added to end of each value to mitigate name
 * collisions with the messages of the same name.
 */

enum ParameterType {
	TrackPT = 0;
	PluginPT = 1;
}


/*
 * PortType defines Input or Output type
 */

enum PortType {
	InputPort = 0;
	OutputPort = 1;
}



